import numpy as np
from scipy import stats
import matplotlib.pyplot as plt

def normal_dis(miu=0, sigma=1):
    """
    正态分布有两个参数
    :param miu: 均值
    :param sigma: 标准差
    :return:
    """

    norm_dis = stats.norm(miu, sigma)  # 利用相应的分布函数及参数，创建一个冻结的正态分布(frozen distribution)
    x = np.linspace(-5, 15, 101)  # 在区间[-5, 15]上均匀的取101个点

    # 计算该分布在x中个点的概率密度分布函数值(PDF)
    pdf = norm_dis.pdf(x)

    # 计算该分布在x中个点的累计分布函数值(CDF)
    cdf = norm_dis.cdf(x)

    # 下面是利用matplotlib画图
    plt.figure(1)
    # plot pdf
    plt.subplot(211)  # 两行一列，第一个子图
    plt.plot(x, pdf, 'b-',  label='pdf')
    plt.ylabel('Probability')
    plt.title(r'PDF/CDF of normal distribution')
    plt.text(-5.0, .12, r'$\mu={},\ \sigma={}$'.format(miu, sigma))  # 3是标准差，不是方差
    plt.legend(loc='best', frameon=False)
    # plot cdf
    plt.subplot(212)
    plt.plot(x, cdf, 'r-', label='cdf')
    plt.ylabel('Probability')
    plt.legend(loc='best', frameon=False)

    plt.show()

# normal_dis(miu=5, sigma=3)

def diff_normal_dis():
    """
    不同参数下的指数分布
    :return:
    """
    norm_dis_0 = stats.norm(0, 1)  # 标准正态分布
    norm_dis_1 = stats.norm(0, 0.5)
    norm_dis_2 = stats.norm(0, 2)
    norm_dis_3 = stats.norm(2, 2)

    x0 = np.linspace(norm_dis_0.ppf(1e-8), norm_dis_0.ppf(0.99999999), 1000)
    x1 = np.linspace(norm_dis_1.ppf(1e-10), norm_dis_1.ppf(0.9999999999), 1000)
    x2 = np.linspace(norm_dis_2.ppf(1e-6), norm_dis_2.ppf(0.999999), 1000)
    x3 = np.linspace(norm_dis_3.ppf(1e-6), norm_dis_3.ppf(0.999999), 1000)
    fig, ax = plt.subplots(1, 1)
    ax.plot(x0, norm_dis_0.pdf(x0), 'r-', lw=2, label=r'$\mu=0, \sigma=1$')
    ax.plot(x1, norm_dis_1.pdf(x1), 'b-', lw=2, label=r'$\mu=0, \sigma=0.5$')
    ax.plot(x2, norm_dis_2.pdf(x2), 'g-', lw=2, label=r'$\mu=0, \sigma=2$')
    ax.plot(x3, norm_dis_3.pdf(x3), 'y-', lw=2, label=r'$\mu=2, \sigma=2$')
    plt.ylabel('Probability')
    plt.title(r'PDF of Normal Distribution')
    ax.legend(loc='best', frameon=False)
    plt.show()

diff_normal_dis()